package org.example.aigc.controller;

import jakarta.servlet.http.HttpServletRequest;
import org.example.aigc.entity.Course;
import org.example.aigc.entity.Part;
import org.example.aigc.entity.Section;
import org.example.aigc.service.CourseService;
import org.example.aigc.utils.Reply;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.util.List;


@RequestMapping("/course")
@RestController
public class CourseController {

    private final CourseService courseService;

    @Autowired
    public CourseController(CourseService courseService) {
        this.courseService = courseService;
    }

    /**
     * 获取所有的课程信息
     *
     * @return 返回课程信息
     */
    @GetMapping("/getAll")
    public Reply getAllCourse() {
        List<Course> courses = courseService.getAllCourse();
        return new Reply("获取所有课程信息").ok(0, "成功").put("courses", courses);
    }

    /**
     * 根据课程 id 获取课程信息
     *
     * @param id 课程的 id
     * @return 返回查询状态
     */
    @PostMapping("/getById")
    public Reply getById(@RequestParam Long id) {
        Course course = courseService.getById(id);
        if (course == null) {
            return new Reply("获取课程" + id + "信息").error(1, "未查询到相关信息");
        }
        return new Reply("获取课程" + id + "信息").ok(0, "成功").put("course", course);
    }

    /**
     * 查询课程是否被用户收藏
     *
     * @param request  请求变量
     * @param courseId 课程 id
     * @return 返回查询状态
     */
    @PostMapping("/isFavorite")
    public Reply isFavorite(
            HttpServletRequest request,
            @RequestParam Long courseId) {
        Boolean isFavorite = courseService.isFavorite(request, courseId);
        return isFavorite == null ?
                new Reply("课程" + courseId + "是否被收藏").error(1, "用户未登录") :
                new Reply("课程" + courseId + "是否被收藏").ok(0, "成功").put("favorite", isFavorite);
    }

    /**
     * 教师上传课程
     *
     * @param request    请求变量
     * @param courseName 课程名
     * @param coverName  课程封面路径（名称）
     * @param detail     课程细节
     * @return 返回查询状态和课程 id
     */
    @PostMapping("/create")
    public Reply createCourse(
            HttpServletRequest request,
            @RequestParam("courseName") String courseName,
            @RequestParam("coverName") String coverName,
            @RequestParam("detail") String detail,
            @RequestParam("audioId") Long audioId,
            @RequestParam("appearanceId") Long appearanceId) {
        return courseService.createCourse(request, courseName, coverName, detail, audioId, appearanceId);
    }

    /**
     * 删除课程
     *
     * @param courseId 待删除的课程 id
     * @return 返回删除状态
     */
    @PostMapping("/delete")
    public Reply deleteCourse(
            @RequestParam("courseId") Long courseId) {
        int code = courseService.deleteCourse(courseId);
        switch (code) {
            case 0 -> {
                return new Reply("删除课程 " + courseId).ok(code, "成功");
            }
            case 1 -> {
                return new Reply("删除课程 " + courseId).error(code, "未查询到该课程信息");
            }
            case 2 -> {
                return new Reply("删除课程 " + courseId).error(code, "视频删除失败");
            }
            case 3 -> {
                return new Reply("删除课程 " + courseId).error(code, "视频路径错误");
            }
            case 4 -> {
                return new Reply("删除课程 " + courseId).error(code, "封面删除失败");
            }
            case 5 -> {
                return new Reply("删除课程 " + courseId).error(code, "封面知识库失败");
            }
            default -> {
                return new Reply("删除课程 " + courseId).error(4, "其他错误");
            }
        }
    }

    /**
     * 根据课程id返回课程部分
     *
     * @param courseId 课程 id
     * @return 返回课程的部分
     */
    @PostMapping("/getPart")
    public Reply getPartById(@RequestParam("id") Long courseId) {
        List<Part> parts = courseService.getPartByCourseId(courseId);
        return new Reply("获取课程部分").ok(0, "成功").put("parts", parts);
    }

    /**
     * 创建课程部分
     *
     * @param name     部分名
     * @param chapter  章节索引
     * @param courseId 部分所属课程
     * @return 返回创建状态
     */
    @PostMapping("/createPart")
    public Reply createPart(
            @RequestParam("name") String name,
            @RequestParam("chapter") String chapter,
            @RequestParam("courseId") Long courseId) {
        return courseService.createPart(name, chapter, courseService.getById(courseId));
    }

    /**
     * 删除课程部分
     *
     * @param id 根据课程部分的id删除
     * @return 返回删除状态
     */
    @PostMapping("/deletePart")
    public Reply deletePart(
            @RequestParam("id") Long id) {
        int code = courseService.deletePart(id);
        if (code == 0) {
            return new Reply("删除部分 " + id).ok(code, "成功");
        }
        return new Reply("删除部分 " + id).error(2, "其他错误");
    }

    /**
     * 更新课程详情
     *
     * @param request 请求变量
     * @param id      课程 id
     * @param detail  要更新的课程详情
     * @return 返回更新状态
     */
    @PostMapping("/updateDetail")
    public Reply updateDetail(
            HttpServletRequest request,
            @RequestParam("id") Long id,
            @RequestParam("detail") String detail) {
        int code = courseService.updateDetail(request, id, detail);
        switch (code) {
            case 0 -> {
                return new Reply("更新课程 " + id + " 详情").ok(code, "成功");
            }
            case 1 -> {
                return new Reply("更新课程 " + id + " 详情").error(code, "用户未登录");
            }
            case 2 -> {
                return new Reply("更新课程 " + id + " 详情").error(code, "用户不是教师");
            }
            case 3 -> {
                return new Reply("更新课程 " + id + " 详情").error(code, "课程不存在");
            }
            default -> {
                return new Reply("更新课程 " + id + " 详情").error(4, "其他错误");
            }
        }
    }

    /**
     * 删除课程章节
     *
     * @param id 章节 id
     * @return 返回删除状态
     */
    @PostMapping("/deleteSection")
    public Reply deleteSection(
            @RequestParam("id") Long id) {
        int code = courseService.deleteSection(id);
        switch (code) {
            case 0 -> {
                return new Reply("删除章节 " + id).ok(code, "成功");
            }
            case 1 -> {
                return new Reply("删除章节 " + id).error(code, "PPT相关文件删除失败");
            }
            case 2 -> {
                return new Reply("删除章节 " + id).error(code, "PPT相关文件路径错误");
            }
            case 3 -> {
                return new Reply("删除章节 " + id).error(code, "视频文件删除失败");
            }
            case 4 -> {
                return new Reply("删除章节 " + id).error(code, "视频文件路径错误");
            }
            default -> {
                return new Reply("删除章节 " + id).error(4, "其他错误");
            }
        }
    }

    /**
     * 创建章节
     *
     * @param name      章节名
     * @param videoName 章节视频名
     * @param pptId     ppt页码对应时间
     * @param times     时间列表
     * @param partId    章节所属的部分 id
     * @param courseId  课程 id
     * @param chapter   章节的索引
     * @return 返回创建状态
     */
    @PostMapping("/createSection")
    public Reply createSection(
            @RequestParam("name") String name,
            @RequestParam("videoName") String videoName,
            @RequestParam("timeList") String times,
            @RequestParam("partId") Long partId,
            @RequestParam("pptId") Long pptId,
            @RequestParam("courseId") Long courseId,
            @RequestParam("chapter") String chapter) {
        return courseService.createSection(name, videoName, times, pptId, partId, courseId, chapter);
    }

    /**
     * 获取部分的章节信息
     *
     * @param partId 章节所属部分 id
     * @return 返回章节列表
     */
    @PostMapping("/getSection")
    public Reply getSectionByPartId(@RequestParam("partId") Long partId) {
        List<Section> sections = courseService.getSectionByPartId(partId);
        return new Reply("获取课程章节").ok(0, "成功").put("sections", sections);
    }

    /**
     * 创建ppt，内置ppt和content上传知识库功能
     * @param pptName ppt名
     * @param content 授课内容
     * @param courseId 课程id
     * @return 创建状态
     */
    @PostMapping("/createPPT")
    public Reply createPPT(@RequestParam("pptName") String pptName,
                           @RequestParam("content") String content,
                           @RequestParam("courseId") Long courseId) {
        return courseService.createPPT(pptName, content,courseId);
    }

    /**
     * 调用外部服务，根据图片URL生成台词
     * @param imageURL 图片URL
     * @return 生成的台词
     */
    @PostMapping("/generateWord")
    @ResponseBody
    public String generateWord(@RequestParam("imageURL") String imageURL) {
        try {
            return courseService.generateWord(imageURL);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

}
